home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / STATS_H.C < prev    next >
C/C++ Source or Header  |  1997-09-06  |  7KB  |  268 lines

  1. #include "global.h"
  2. #ifdef STATS_HTTP
  3. #include "stats.h"
  4. #include "stats_h.h"
  5.  
  6.  
  7. #if !defined(_lint)
  8. static char rcsid[] OPTIONAL = "$Id: stats_h.c,v 1.1 1997/09/07 00:31:16 root Exp root $";
  9. #endif
  10.  
  11.  
  12.  
  13. static struct http_stats httpstats;
  14.  
  15. static const char httpdailyhdr[] = "     TOTAL REQUESTS%-22.22sPBBS REQUESTS\n\n";
  16. static const char httpweeklyhdr[] = "         TOTAL REQUESTS%-27.27sPBBS REQUESTS\n\n";
  17. static const char httpstr[] = "HTTP Requests";
  18. static const char httpmonthlyhdr[] = "        TOTAL REQUESTS%-29.29sPBBS REQUESTS\n\n";
  19. static const char httpyearlyhdr[] = "   TOTAL%-19.19sPBBS\n\n";
  20.  
  21.  
  22. static struct cmds STATShttpcmds[] = {
  23.     { "clear",    doSTATclear_http,    0,    0,    NULLCHAR },
  24.     { "daily",    STATdaily_http,        0,    0,    NULLCHAR },
  25.     { "general",    STATgeneral_http,    0,     0,    NULLCHAR },
  26.     { "monthly",    STATmonthly_http,    0,     0,    NULLCHAR },
  27.     { "weekly",    STATweekly_http,    0,     0,    NULLCHAR },
  28.     { "yearly",    STATyearly_http,    0,     0,    NULLCHAR },
  29.     { NULLCHAR,    NULL,            0,    0,    NULLCHAR }
  30. };
  31.  
  32.  
  33.  
  34. int
  35. doSTAThttp(argc,argv,p)
  36. int argc;
  37. char *argv[];
  38. void *p;
  39. {
  40.     return subcmd(STATShttpcmds,argc,argv,p);
  41. }
  42.  
  43.  
  44.  
  45. int
  46. doSTATclear_http (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  47. {
  48.     if(Curproc->input != Command->input)
  49.         tputs (STAT_cannotclear);
  50.     else    {
  51.         memset (&httpstats, 0, sizeof (struct http_stats));
  52.         httpstats.days = 1;
  53.         httpstats.start = time((time_t *)0);
  54.         savestats_http();
  55.         log (-1, "Clearing HTTP stats");
  56.     }
  57.     return 0;
  58. }
  59.  
  60.  
  61.  
  62. int
  63. STATgeneral_http (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  64. {
  65. char buf1[26], buf2[26], buf3[36];
  66. int temp, l;
  67. int highest[2], second[2];
  68.  
  69.     tprintf ("\n%26.26s: %-26.26s%-24.24s\n", "USAGE", "Total Requests", "PBBS Requests");
  70.     sprintf (buf1, "%ld", httpstats.connects[0]);
  71.     sprintf (buf2, "%ld", httpstats.connects[1]);
  72.     sprintf (buf3, "Requests since %6.6s", &(ctime(&httpstats.start))[4]);
  73.     tprintf ("  %24.24s: %-26.26s%-24.24s\n", buf3, buf1, buf2);
  74.     sprintf (buf1, "%ld", httpstats.dailyconnects[0]);
  75.     sprintf (buf2, "%ld", httpstats.dailyconnects[1]);
  76.     tprintf ("  %24.24s: %-26.26s%-24.24s\n", "Requests since midnight",
  77.         buf1, buf2);
  78.     temp = 0;
  79.     sprintf (buf1, "%d", (httpstats.days > 1) ? (int)((httpstats.connects[0] - httpstats.dailyconnects[0] + (httpstats.days - 2)) / (httpstats.days - 1)) : (int)httpstats.connects[0]);
  80.     sprintf (buf2, "%d", (httpstats.days > 1) ? (int)((httpstats.connects[1] - httpstats.dailyconnects[1] + (httpstats.days - 2)) / (httpstats.days - 1)) : (int)httpstats.connects[1]);
  81.     tprintf ("  %24.24s: %-26.26s%-24.24s\n", "Average requests per day",
  82.         buf1, buf2);
  83.     highest[0] = highest[1] = -1;
  84.     second[0] = second[1] = -1;
  85.     for (temp = 0; temp < 24; temp++)
  86.         for (l = 0; l < 2; l++)    {
  87.             if (highest[l] == -1 || httpstats.hourly[temp][l] > httpstats.hourly[highest[l]][l])    {
  88.                 second[l] = highest[l];
  89.                 highest[l] = temp;
  90.             } else if (second[l] == -1 || httpstats.hourly[temp][l] > httpstats.hourly[second[l]][l])
  91.                 second[l] = temp;
  92.         }
  93.     sprintf (buf1, "At %02d and %02d o'clock", highest[0], second[0]);
  94.     sprintf (buf2, "At %02d and %02d o'clock", highest[1], second[1]);
  95.     tprintf ("%26.26s: %-26.26s%-24.24s\n\n", "Rush hours", buf1, buf2);
  96.     return 0;
  97. }
  98.  
  99.  
  100.  
  101. int
  102. STATdaily_http (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  103. {
  104.     tprintf (dailyhdr, httpstr);
  105.     tprintf (httpdailyhdr, STAT_emptystr);
  106.     doGraph (24, httpstats.hourly);
  107.     tputs (STAT_dailytrailer);
  108.     return 0;
  109. }
  110.  
  111.  
  112.  
  113. int
  114. STATweekly_http (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  115. {
  116.     tprintf (weeklyhdr, httpstr);
  117.     tprintf (httpweeklyhdr, STAT_emptystr);
  118.     doGraph (7, httpstats.daily);
  119.     tputs (STAT_weeklytrailer);
  120.     return 0;
  121. }
  122.  
  123.  
  124.  
  125. int
  126. STATmonthly_http (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  127. {
  128.     tprintf (monthlyhdr, httpstr);
  129.     tprintf (httpmonthlyhdr, STAT_emptystr);
  130.     doGraph (31, httpstats.monthly);
  131.     tputs (STAT_monthlytrailer);
  132.     return 0;
  133. }
  134.  
  135.  
  136.  
  137. int
  138. STATyearly_http (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  139. {
  140.     tprintf (yearlyhdr, httpstr);
  141.     tprintf (httpyearlyhdr, STAT_emptystr);
  142.     doGraph (12, httpstats.yearly);
  143.     tputs (STAT_yearlytrailer);
  144.     return 0;
  145. }
  146.  
  147.  
  148.  
  149. void
  150. STATS_addhttp (int which)
  151. {
  152.     if (which < 0 || which > 1)
  153.         return;
  154.     httpstats.connects[which]++;
  155.     httpstats.dailyconnects[which]++;
  156.     httpstats.hour[which]++;
  157.     httpstats.day[which]++;
  158.     httpstats.month[which]++;
  159. }
  160.  
  161.  
  162. void
  163. loadstats_http (void)
  164. {
  165. FILE *fp;
  166. char buffer[256];
  167.  
  168.     sprintf (buffer, "%s/http.dat", STATSDir);
  169.     fp = fopen (buffer, "r");
  170.     if (fp != NULLFILE)    {
  171.         (void) fread (&httpstats, sizeof (struct http_stats), 1, fp);
  172.         (void) fclose (fp);
  173.     }
  174. }
  175.  
  176.  
  177.  
  178. void
  179. savestats_http (void)
  180. {
  181. FILE *fp;
  182. char buffer[256];
  183.  
  184.     sprintf (buffer, "%s/http.dat", STATSDir);
  185.     fp = fopen (buffer, "w");
  186.     if (fp != NULLFILE)    {
  187.         fwrite (&httpstats, sizeof (struct http_stats), 1, fp);
  188.         (void) fclose (fp);
  189.     } else
  190.         log (-1, "Can't open stats file '%s/http.dat'", STATSDir);
  191. }
  192.  
  193.  
  194.  
  195. void
  196. newhour_http (int hour)
  197. {
  198.     httpstats.hourly[hour][0] = httpstats.hour[0];
  199.     httpstats.hourly[hour][1] = httpstats.hour[1];
  200.     httpstats.hour[0] = httpstats.hour[1] = 0;
  201. }
  202.  
  203.  
  204.  
  205. void
  206. newday_http (int day)
  207. {
  208.     httpstats.daily[day][0] = httpstats.day[0];
  209.     httpstats.daily[day][1] = httpstats.day[1];
  210. }
  211.  
  212.  
  213.  
  214. void
  215. endmonthclear_http (int day, int month)
  216. {
  217. int k;
  218. FILE *fp;
  219.  
  220.     /* clear out non-existent days of last month */
  221.     for (k = day; k < 31; k++)
  222.         httpstats.monthly[k][0] = httpstats.monthly[k][1] = 0L;
  223.     httpstats.yearly[month][0] = httpstats.month[0];
  224.     httpstats.yearly[month][1] = httpstats.month[1];
  225.     fp = tmpfile();
  226.     if (fp)    {
  227.         fprintf (fp, "Monthly HTTP Stats for the month of %s: %s\n\n", Months[month], Hostname);
  228.         fprintf (fp, "Total Requests: %ld\n", httpstats.month[0]);
  229.         fprintf (fp, "PBBS Requests: %ld\n",  httpstats.month[1]);
  230.         rewind (fp);
  231.         (void) rdaemon (fp, NULLCHAR, NULLCHAR, "sysop", "Monthly HTTP Stats", 'P', 0);
  232.         (void) fclose (fp);
  233.     }
  234.     httpstats.month[0] = httpstats.month[1] = 0;
  235. }
  236.  
  237.  
  238.  
  239. void
  240. endday_http (int day)
  241. {
  242.     httpstats.monthly[day][0] = httpstats.day[0];
  243.     httpstats.monthly[day][1] = httpstats.day[1];
  244.     httpstats.day[0] = httpstats.day[1] = 0;
  245.     httpstats.days++;
  246.     httpstats.dailyconnects[0] = httpstats.dailyconnects[1] = 0;
  247. }
  248.  
  249.  
  250.  
  251. void
  252. eachcycle_http (time_t now)
  253. {
  254.     httpstats.last = now;
  255. }
  256.  
  257.  
  258.  
  259. void
  260. init_http (time_t now)
  261. {
  262.     httpstats.days = 1;
  263.     httpstats.start = now;
  264. }
  265.  
  266.  
  267. #endif /* STATS_HTTP */
  268.